/*
 * @Author: daifen
 * @Date: 2020-06-01 11:58:32
 * @LastEditors: daifen
 */
import axios from 'axios'
import { Notification, MessageBox, Message } from 'element-ui'
import store from '@/store'
import { getToken } from '@/utils/auth'
import Global from "@/utils/global";
import { Loading } from 'element-ui'

axios.defaults.headers['Content-Type'] = 'application/json;charset=utf-8';
// 创建axios实例
const service = axios.create({
  // axios中请求配置有baseURL选项，表示请求URL公共部分
  baseURL: _cfg.serverUrl,
  // 超时
  timeout: 20000000
});

let loadinginstace;
// request拦截器
service.interceptors.request.use(
  config => {
    loadinginstace = Loading.service({
      lock: true,
      // text: 'Loading',
      spinner: 'el-icon-loading',
      background: 'rgba(250, 250, 250, 0.8)',
      customClass: "osloading",
      fullscreen: true
    })
    
    if (getToken()) {
      config.headers['Authorization'] = 'Bearer ' + getToken() // 让每个请求携带自定义token 请根据实际情况自行修改
    }
    return config
  },
  error => {
    loadinginstace.close()
    console.log(error);
    Promise.reject(error)
  }
);

// 响应拦截器
service.interceptors.response.use(res => {
  const code = res.data.code;
  if (code === 401) {
    setTimeout(() => {
      loadinginstace.close()
    }, 200)
    MessageBox.confirm(
      '登录状态已过期，您可以继续留在该页面，或者重新登录',
      '系统提示',
      {
        confirmButtonText: '重新登录',
        cancelButtonText: '取消',
        type: 'warning'
      }
    ).then(() => {
      store.dispatch('LogOut').then(() => {
        location.reload() // 为了重新实例化vue-router对象 避免bug
      })
    })
  } else if (code !== 200) {
    console.log(code)
    if(code==-4002){
      //密码不符合规则时自动跳转到修改密码页面，否则无法登陆
      location.href='/modifypwd';
      return ;
    }
    setTimeout(() => {
      loadinginstace.close()
    }, 200)
    Notification.error({
      title: res.data.msg
    });
    return Promise.reject('error')
  } else {
    setTimeout(() => {
      loadinginstace.close()
    }, 200)
    return res.data
  }
},
  error => {
    setTimeout(() => {
      loadinginstace.close()
    }, 200)
    console.log('err' + error);
    Message({
      message: error.message,
      type: 'error',
      duration: 5 * 1000
    });
    return Promise.reject(error)
  }
);

export default service
